package com.tedu.api;

import org.junit.jupiter.api.Test;

/**
 * API
 * String 字符串类  不可改变类  BUG
 * 假设：10000000个String类=---内存
 * 操作系统发现内存如果越来越小，会在硬盘上开辟空间---软件会卡
 * 建议：存储字符串类似---String
 *
 * 可变
 * StringBuilder   创建字符串随时进行变化【修改，增加，插入】
 * String不可改变的类，频繁创建对象，带来内存损耗
 * StringBuilder类解决内存损耗
 * 创建方式 StringBuilder sb=new StringBuilder();
 *
 * C语言          好处：创建对象，顺便对象进行销毁
 *               例如：定义变量  int a=malloc(4);开辟四个字节空间
 *               a=1
 *               free(a)      清理内存
 * Java语言       好处：创建完对象，不用管，等CG垃圾回收机制，进行回收
 *               例如：定义变量 int a=1; 开辟空间，交给GC【使用方便】
 *
 */
public class stringBuilderAPI {
    /**Java.lang 包下
     * StringBuilder可变的字符串对象类
     * 什么情况下使用：有大量字符串拼接，建议StringBuilder
     * String str=“123”  String s=“456”  str  s出现新对象
     * append（） 方法  拼接，等同于String加号意思
     */
    @Test
    public void testStringBuilder(){
        String str="你是我的";
        //创建一个空字符串，接受传入字符串【原有字符串上大量拼接】
        StringBuilder sb=new StringBuilder(str);//不会产生新对象
        sb.append("小可爱");
        System.out.println("原来的对象："+sb);
    }
    /**
     * 错误：String 加号拼接 1000000000000000000 不断创建新对象
     *
     */
    /**
     * StringBuilder可变的字符串
     * replace(开始坐标，结束坐标，替换字符串） 替换  含头不含尾
     * 作用：可以将字符串中指定范围的内存替换成给定字符
     */
    @Test
    public void testReplace(){
        StringBuilder sb=new StringBuilder("你就是我的，小可爱~");
        sb=sb.replace(6,9,"小baby");
        System.out.println("SB替换后："+sb);
    }
    /**
     * StringBuilder与StringBuffer----可变字符串类【用法完全一致】
     * append方法，replace方法，insert方法通用
     * insert(插入坐标，给定字符串)方法     返回值String
     * 作用：将给定的字符串插入当前字符串中
     */
    @Test
    public void testInsert(){
        StringBuffer sb=new StringBuffer("你都是我的小可爱");
        sb.insert(0,"从今以后的每天");
        System.out.println("插入后字符串"+sb);
    }
}
